#include "arbol de busqueda.h"
#include "stdio.h"
#include "stdlib.h"
#include "TDA_DNS.h"
#include "Listasimple.h"
#define MAX_CHAR_DOMINIO 254


int crearDNS(TDADNS *dns, size_t tamDato) {

    TListaSimple* lista = malloc (sizeof (TListaSimple)); /** agregar al TP!!! */
    ls_Crear (lista, sizeof (TAB_BUSQ));
    dns->lista_dns = lista;
    return 0;

}

void destruirDNS(TDADNS *dns) {


    ls_Vaciar(dns->lista_dns);


}

int agregarDominio(TDADNS *dns, char* dominio, void* dato) {

char* dominio_nuevo = malloc (MAX_CHAR_DOMINIO * sizeof (char));
char* el_resto = malloc (MAX_CHAR_DOMINIO * sizeof (char));
int largo_dominio = strlen (dominio);
int i = 0;
Telem_lista_dns* arbol_aux = malloc (sizeof (Telem_lista_dns));
Telem_dns* aux = malloc (sizeof (Telem_dns));


memset (dominio_nuevo, '\0' ,MAX_CHAR_DOMINIO);

memset (el_resto, '\0' ,MAX_CHAR_DOMINIO);

while ((dominio [i] != '.') && (i <= largo_dominio)) {

    dominio_nuevo [i] = dominio [i];

    i++;

}

if (strlen (dominio_nuevo) == 0) { /**agregar esto al TP!!! **/

    return -1;

}

    aux->nombre_dominio = dominio_nuevo;
    aux->dato = dato;

/* ls_MoverCorriente (dns->lista_dns, LS_PRIMERO); esto lo tengo que hacer AFUERA de la fn, es decir, el el "main"*/

    if (ls_Vacia (dns->lista_dns)) {

        arbol_aux->arbol_dns = malloc (sizeof (TAB_BUSQ));

        AB_Busq_Crear (arbol_aux->arbol_dns, sizeof (Telem_dns), (f_comparar) fn_comparadora_elementos_dns);

        AB_Busq_Insertar (arbol_aux->arbol_dns, aux);

        ls_Insertar (dns->lista_dns, LS_PRIMERO, arbol_aux);

        strncpy (el_resto, &(dominio[i+1]), (strlen(dominio)-strlen(dominio_nuevo)));

        agregarDominio (dns, el_resto, dato);

        }


    else {

        if (!ls_MoverCorriente (dns->lista_dns, LS_SIGUIENTE)){

            arbol_aux->arbol_dns = malloc (sizeof (TAB_BUSQ));

            AB_Busq_Crear (arbol_aux->arbol_dns, sizeof (Telem_dns), (f_comparar) fn_comparadora_elementos_dns);

            AB_Busq_Insertar (arbol_aux->arbol_dns, aux);

            ls_Insertar (dns->lista_dns, LS_SIGUIENTE, arbol_aux);

            strncpy (el_resto, &(dominio[i+1]), (strlen(dominio)-strlen(dominio_nuevo)));

            agregarDominio (dns, el_resto, dato);

            }

            else {

                ls_ElemCorriente (*dns->lista_dns, arbol_aux);

                AB_Busq_Insertar (arbol_aux->arbol_dns, aux);

                ls_ModifCorriente (dns->lista_dns, arbol_aux);

                strncpy (el_resto, &(dominio[i+1]), (strlen(dominio)-strlen(dominio_nuevo)));

                agregarDominio (dns, el_resto, dato);

                }

        }

    return 0;

}



void obtenerValor(TDADNS* dns, char* dominio, void* dato) {


char* dominio_del_dato = malloc (MAX_CHAR_DOMINIO * sizeof (char));
int largo_dominio = strlen (dominio);
int i = 0;
Telem_lista_dns* arbol_aux = malloc (sizeof (Telem_lista_dns));
Telem_dns* aux = malloc (sizeof (Telem_dns));
Telem_dns* elem_a_devolver = malloc (sizeof (Telem_dns));

memset (dominio_del_dato, '\0' ,MAX_CHAR_DOMINIO);


while ((dominio [i] != '.') && (i <= largo_dominio)) {

    dominio_del_dato [i] = dominio [i];

    i++;

}

    ls_MoverCorriente (dns->lista_dns, LS_PRIMERO);

    ls_ElemCorriente (*dns->lista_dns, arbol_aux);

    aux->nombre_dominio = dominio_del_dato;

    AB_Busq_Buscar (arbol_aux->arbol_dns, aux , elem_a_devolver);

    dato = elem_a_devolver->dato;


}

int existeDominio(TDADNS* dns, char* dominio) {


char* dominio_nuevo = malloc (MAX_CHAR_DOMINIO * sizeof (char));
char* el_resto = malloc (MAX_CHAR_DOMINIO * sizeof (char));
int largo_dominio = strlen (dominio);
Telem_dns* aux = malloc (sizeof (Telem_dns));
int i = 0;
void* a;

memset (dominio_nuevo, '\0' ,MAX_CHAR_DOMINIO);

memset (el_resto, '\0' ,MAX_CHAR_DOMINIO);



      while ((dominio [i] != '.') && (i <= largo_dominio)) {

            dominio_nuevo [i] = dominio [i];

            i++;
      }

    aux->nombre_dominio = malloc (MAX_CHAR_DOMINIO * sizeof (char));
    aux->nombre_dominio = dominio_nuevo;


    if (buscar_dominio (dns, aux, a) && (strlen(dominio_nuevo) != 0)) {

        strncpy (el_resto, &(dominio[i+1]), (strlen(dominio)-strlen(dominio_nuevo)));

        ls_MoverCorriente (dns->lista_dns, LS_SIGUIENTE);

        existeDominio (dns, el_resto);



    }


    else {


           return -1;


}

    return 0;
}



void eliminarDominio(TDADNS *dns, char* dominio) { /*moverse al principio de la lista antes de empezar*/



    char* dominio_a_eliminar = malloc (MAX_CHAR_DOMINIO * sizeof (char));
    char* el_resto = malloc (MAX_CHAR_DOMINIO * sizeof (char));
    int largo_dominio = strlen (dominio);
    int i = 0;
    Telem_lista_dns* elem_lista_aux = malloc (sizeof (Telem_lista_dns));
    Telem_dns* elem_a_eliminar = malloc (sizeof (Telem_dns));

    memset (dominio_a_eliminar, '\0' ,MAX_CHAR_DOMINIO);

    memset (el_resto, '\0' ,MAX_CHAR_DOMINIO);



    while ((dominio [i] != '.') && (i <= largo_dominio)) {

    dominio_a_eliminar [i] = dominio [i];

    i++;

}

    elem_a_eliminar->nombre_dominio = malloc (MAX_CHAR_DOMINIO * sizeof (char));
    memset (elem_a_eliminar->nombre_dominio, '0', MAX_CHAR_DOMINIO);
    elem_a_eliminar->nombre_dominio = dominio_a_eliminar;

    ls_ElemCorriente (*dns->lista_dns, elem_lista_aux);

    AB_Busq_Borrar (elem_lista_aux->arbol_dns, elem_a_eliminar);

    ls_MoverCorriente (dns->lista_dns, LS_SIGUIENTE);

    strncpy (el_resto, &(dominio[i+1]), (strlen(dominio)-strlen(dominio_a_eliminar)));

    eliminarDominio (dns, el_resto);



}





int escribirLogDNS(TDADNS dns, FILE* archivo) {




return 0;
}


int buscar_dominio (TDADNS* dns, Telem_dns* paquete_dominio, void* elem_encontrado) {  /* busco secuencialmente en la lista (pre: lista posocionada en el primero), busco en el arbol, encuentro el nodo y lo devuelvo */

Telem_lista_dns* aux_lista = malloc (sizeof (Telem_dns));
Telem_dns* aux = malloc (sizeof (Telem_dns));

ls_ElemCorriente (*dns->lista_dns, aux_lista);

if (AB_Busq_Buscar (aux_lista->arbol_dns, paquete_dominio, aux)) {

    return 0;

    }


else {

return -1;

    }


}


int fn_comparadora_elementos_dns (Telem_dns* elem1, Telem_dns* elem2) { /*esta fn compara elementos del tipo Telem_dns, o sea, el dominio por un lado y el dato por otro */

    if ((strcmp (elem1->nombre_dominio ,elem2->nombre_dominio)))  {

        return 0;

    }

    else {

        return -1;

        }



}
